Small-signal gain with a shaped pump profile
This guide shows how to move beyond a constant gain factor and model an amplifier head where the
pump beam itself is shaped: it has a transversal intensity profile across the aperture and it is
partially absorbed along the optical axis. The amplifier_chain.rs
example covers the simpler Const model; here the gain field depends on position inside the
medium, so two parallel rays through the same slab leave with different gain factors.
When to use Monochromatic Small Signal Gain instead of Const
Const assigns one factor to the whole ray bundle regardless of where a ray enters the medium or
how long its chord through it is. That is appropriate for chain layout and first estimates. Use
Monochromatic Small Signal Gain when any of the following matters:
- The pump spot does not cover the full aperture — rays near the edge are less pumped than axial ones.
- The pump is end-pumped and partially absorbed — the near face of the medium is more strongly inverted than the far face.
- Oblique rays travel longer chords and therefore accumulate more gain than on-axis ones.
- The analysis needs to be run in ray tracing or ghost focus mode (energy flow cannot use
Small Signal Gainbecause it carries no per-ray geometry).
Monochromatic Small Signal Gain is an unsaturated model: extracting energy does not draw the
inversion down. It holds as long as the extracted fluence is small compared with the stored
fluence in the medium. For saturating amplifiers the next gain stage (Frantz–Nodvik) will be the
right tool.
Setting it up in code
The complete, runnable program that shows these concepts with a fluence detector is
opossum_core/examples/amplifier_gaussian_pump_fluence.rs; run it with
cargo run -p opossum_core --example amplifier_gaussian_pump_fluence
That example uses a flat longitudinal profile to isolate the transversal effect. The code below focuses on the gain and pump source configuration for a Lambert-Beer longitudinal profile; the rest of the setup follows the same pattern.
The hardware is a plane-parallel glass slab — a Lens
with infinite radii of curvature. The slab is 40 mm thick and refractive index 1.5, exactly as any
passive lens would be. Nothing about the node says “amplifier”:
#![allow(unused)]
fn main() {
use opossum_core::{
gain::{
AnalyticPump, LambertBeerProfile, GainModel, LongitudinalProfile, MonochromaticSmallSignalGain,
PumpDirection, PumpSource, TransversalProfile,
},
prelude::*,
reciprocal_centimeter,
utils::super_gaussian::SuperGaussianShape,
};
let head = scenery.add_node(Lens::new(
"amplifier head",
millimeter!(f64::INFINITY), // flat input surface
millimeter!(f64::INFINITY), // flat output surface
millimeter!(40.0),
RefrIndexConst::new(1.5)?,
)?)?;
}
A pump scenario assigns the gain model and the pump source to that node separately. The gain model carries the magnitude — the peak gain coefficient g₀ where the pump is strongest; the pump source carries only the shape — the spatial profile β ∈ [0, 1] that says how strongly each point of the medium is pumped relative to that peak:
#![allow(unused)]
fn main() {
// Gain model: unsaturated path-integral gain.
// g₀ is the peak small-signal gain coefficient at the strongest point of the pump profile.
scenario.set_gain_model(
head,
GainModel::MonochromaticSmallSignalGain(MonochromaticSmallSignalGain::new(
reciprocal_centimeter!(0.3), // peak g₀ where the pump is strongest (axis, near face)
)?),
);
// Pump source: Super-Gaussian spot × Lambert-Beer longitudinal decay.
// The pump carries only the shape and the grid it is resolved on — no amplitude here.
scenario.set_pump_source(
head,
PumpSource::Analytic(AnalyticPump::new(
TransversalProfile::SuperGaussian(SuperGaussianShape::new(
millimeter!(0.0, 0.0), // pump centered on the optical axis
millimeter!(5.0, 5.0), // 1/e² half-width 5 mm along x and y
2.0, // order 2: flatter top, steeper edges than a Gaussian
degree!(0.0),
false,
)?),
LongitudinalProfile::LambertBeer(LambertBeerProfile::new(
reciprocal_centimeter!(0.5), // pump absorption coefficient in the medium
PumpDirection::Forward, // pump enters from the input surface
)?),
(64, 64, 32), // 64 × 64 transversal, 32 longitudinal cells
)?),
);
}
Choosing the grid
The (64, 64, 32) grid is the third argument of AnalyticPump::new — the resolution at which
the pump shape β is discretized over the medium. Each cell holds one β value. A ray traverses the
cells exactly (Amanatides–Woo algorithm), so there is no step-size error — only the
discretization of the pump profile onto the grid introduces approximation. Rules of thumb:
- Make
cells_zfine enough to resolve the longitudinal profile: for Lambert-Beer with α = 0.5 cm⁻¹ over 40 mm, roughly 16–32 slices are sufficient for < 1 % error. - Make
cells_xandcells_yfine enough to resolve the transversal profile: a Super-Gaussian with σ = 5 mm over a 20 mm aperture needs around 32–64 cells to be well-sampled. - Finer grids cost proportionally more memory but no additional traversal time per ray.
A constant pump (PumpSource::Const) has no shape to resolve, so it needs no grid and no grid
argument — the model integrates over the exact chord the ray travels through the body.
Running the analysis
Monochromatic Small Signal Gain requires a ray-tracing or ghost-focus analysis; an energy-flow
analysis is refused because it carries no per-ray geometry and cannot integrate g₀ along a path. Configuring
one is the same as for any other model:
#![allow(unused)]
fn main() {
let mut config = RayTraceConfig::default();
config.map_source(
source,
round_collimated_ray_builder(millimeter!(9.0), joule!(1.0), 5)?,
);
let analyzer_id = document.add_analyzer(AnalyzerType::RayTrace(config));
// Tell the analyzer which scenarios to run — without this the model is analyzed passively.
let scenario_ids = document.pump_scenarios().keys().copied().collect();
document
.analyzer_mut(analyzer_id)
.expect("the analyzer just added must be there")
.set_pump_scenarios(scenario_ids);
}
round_collimated_ray_builder produces five concentric rings of collimated rays up to a radius of
9 mm. With the pump spot at σ = 5 mm, the inner rings (r ≈ 0–2 mm) sit near the peak of the
profile; the outer rings (r ≈ 7–9 mm) sit on the tail where the profile has fallen to a small
fraction of its peak.
What to look for in the result
Open the amplifier_gaussian_pump_fluence.opm file in the GUI, run the analysis in the
Gaussian pump scenario, and open the fluence detector report. The fluence map shows:
- A bright central spot where the Gaussian pump profile is strongest and gain is highest.
- A smooth radial fall-off that mirrors the pump’s σ = 5 mm half-width.
- Near-zero fluence beyond the pump spot (r ≫ σ): rays there barely see the pump.
To see the Lambert-Beer longitudinal effect on top of a transversal profile, configure the pump source as shown above (Super-Gaussian × Lambert-Beer) and compare the fluence map with the flat-profile result: oblique rays and axial rays at the same radius will carry slightly different energies because they enter the slab at different longitudinal inversion gradients.
For parameter definitions and the full list of transversal and longitudinal profile options see Pump scenarios.